package control;

import java.awt.Dimension;
import java.awt.event.*;
import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.border.LineBorder;

import modelo.Observador;

import org.osoa.sca.annotations.Reference;

import comunicacion.*;
import interfaz.*;

//public class Controlador {

public class Controlador extends Observador implements Runnable, Serializable{

	private InterfazBienvenida dialog;
	private InterfazProfesor intProf;

	private String temaActual;
	private String preguntaActual;

	private int consecutivoPregunta = 1;

	@Reference
	private IPizarraProfesor servicioProfesor;

	public void setServicioPizarraProfesor(
			IPizarraProfesor servicioPizarraProfesor) {
		this.servicioProfesor = servicioPizarraProfesor;
	}

	/*
	 * @Reference private IChat servicioChat;
	 * 
	 * public void setServicioChat(IChat servicioChat) {
	 * Controlador.servicioChat = servicioChat; }
	 * 
	 * @Reference private IObservable servicioObservable;
	 * 
	 * public void setServicioPizarra(IObservable servicioPizarra) {
	 * Controlador.servicioObservable = servicioPizarra; }
	 */

	/**
	 * Launch the application.
	 */
	// public void main(String[] args) {

	public void run() {
		try {
			dialog = new InterfazBienvenida();
			dialog.setLocationRelativeTo(null);
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);

			intProf = new InterfazProfesor();
			intProf.setVisible(false);

		} catch (Exception e) {
			e.printStackTrace();
		}
		// servicioObservable.asociar(this);

		eventos();
	}

	public void eventos() {

		dialog.getButtonIngresar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!dialog.getTextFieldUsuario().getText().isEmpty()) {

					String profesor = dialog.getTextFieldUsuario().getText();

					// Enviar Usuario a Pizarra por SCA
					boolean confirmacion = servicioProfesor
							.registrarProfesor(dialog.getTextFieldUsuario()
									.getText());

					if (confirmacion) {

						dialog.setVisible(false);

						intProf.setVisible(true);

					} else {
						// Mejorar?
						dialog.getTextFieldUsuario().setText(
								"Error de Autenticacion");
						;
					}
				}

			}
		});

		intProf.getTextFieldValor().addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent evt) {
				char car = evt.getKeyChar();
				if ((car < '0' || car > '9')
						&& intProf.getTextFieldValor().getText().contains(".")) {
					evt.consume();
				} else if ((car < '0' || car > '9') && (car != '.')) {
					evt.consume();
				}
			}
		});

		// Listeners

		intProf.getComboBoxSoluciones().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				// Se obtiene por SCA

				intProf.getCampoExpresiones()
						.setText(
								(intProf.getComboBoxSoluciones()
										.getSelectedItem() + "").split("#")[1]);
				intProf.getCampoExpresiones().repaint();

			}
		});

		intProf.getComboBoxEstudiantes().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				String estudiante = intProf.getComboBoxEstudiantes()
						.getSelectedItem() + "";

				anadirVariablesEstudiante(estudiante);

			}
		});

		intProf.getComboBoxPreguntas().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				if (!(intProf.getComboBoxPreguntas().getSelectedItem() + "")
						.equals("")) {

					String preguntaFormulada = (intProf.getComboBoxPreguntas()
							.getSelectedItem() + "").split("-")[1];

					// Enviar a Pizarra por SCA
					if (servicioProfesor.formularPregunta(preguntaFormulada,
							temaActual)) {

						intProf.getTextAreaPizarra().setText(
								intProf.getTextAreaPizarra().getText()
										+ "Se ha definido una nueva pregunta: "
										+ preguntaFormulada + "\n");
						intProf.getTextFieldFormularPregunta().setText("");
						intProf.repaint();
					} else {
						System.out.println("Error de Comunicacion");
					}
				}
			}
		});

		intProf.getBtnDefinir().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getTextFieldTema().getText().isEmpty()
						&& !intProf.getTextFieldDescripcion().getText()
								.isEmpty()
						&& !intProf.getTextFieldExpresionBase().getText()
								.isEmpty()) {

					String temaEvaluar = intProf.getTextFieldTema().getText();
					String descripcion = intProf.getTextFieldDescripcion()
							.getText();
					String expresionBase = intProf.getTextFieldExpresionBase()
							.getText();

					// Enviar a Pizarra por SCA
					if (servicioProfesor.definirTema(temaEvaluar, descripcion,
							expresionBase)) {

						temaActual = temaEvaluar;

						intProf.getTituloTema().setText(temaEvaluar);
						intProf.getTextAreaPizarra().setText(
								intProf.getTextAreaPizarra().getText()
										+ "Se ha definido un tema a evaluar: "
										+ temaEvaluar + "\n");
						intProf.getTextAreaPizarra()
								.setText(
										intProf.getTextAreaPizarra().getText()
												+ "Del tema se ha definido una nueva expresion: "
												+ expresionBase + "\n");
						intProf.getTextFieldTema().setText("");
						intProf.getTextFieldDescripcion().setText("");
						intProf.getTextFieldExpresionBase().setText("");
						intProf.repaint();
					} else {
						intProf.getTituloTema().setText(
								"Error de comunicacion con la Pizarra");
					}

					// Enviar a los Estudiantes
				}
			}
		});

		intProf.getBtnFormularPregunta().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getTextFieldFormularPregunta().getText().isEmpty()) {
					String preguntaFormulada = intProf
							.getTextFieldFormularPregunta().getText();

					consecutivoPregunta++;

					// Enviar a Pizarra por SCA
					if (servicioProfesor.formularPregunta(consecutivoPregunta
							+ "-" + preguntaFormulada, temaActual)) {

						intProf.getComboBoxPreguntas().addItem(
								consecutivoPregunta + "-" + preguntaFormulada);

						intProf.getTextAreaPizarra().setText(
								intProf.getTextAreaPizarra().getText()
										+ "Se ha definido una nueva pregunta: "
										+ preguntaFormulada + "\n");
						intProf.getTextFieldFormularPregunta().setText("");
					} else {
						System.out.println("Error de Comunicacion");
					}

					// Enviar a los Estudiantes
				}
			}
		});

		intProf.getBtnAnalizar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getCampoExpresiones().getText().isEmpty()) {
					// Debe obtenerse desde SCA
					evaluarSolucion(intProf.getCampoExpresiones().getText());
					// anadirSolucion(intProf.getCampoExpresiones().getText());
					intProf.getCampoExpresiones().setText("");
				}
			}
		});

		intProf.getBtnEnviar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getTextFieldCalificacion().getText().isEmpty()) {

					// !!!Mejorar Primero
					String estudiante = intProf.getComboBoxSoluciones()
							.getSelectedItem() + "";
					String calificacion = intProf.getTextFieldCalificacion()
							.getText();

					// Enviar por SCA
					if (servicioProfesor.enviarCalificacion(estudiante,
							calificacion, intProf.getComboBoxPreguntas()
									.getSelectedItem() + "", temaActual)) {
						intProf.getTextFieldCalificacion().setText("");
						intProf.getEstadoAnalisis().setText("Enviado");
					} else {
						intProf.getEstadoAnalisis().setText(
								"Error de comunicacion con Pizarra");
					}

				}
			}
		});

		intProf.getBtnChatEnviar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getCampoChat().getText().isEmpty()) {
					String mensajeChat = intProf.getCampoChat().getText();

					// Enviar Chat por SCA
					/*
					 * if (!servicioChat.enviarChat(usuario,
					 * mensajeChat).equals( null)) {
					 * 
					 * ArrayList<String> listaChat = (ArrayList<String>)
					 * servicioChat .enviarChat(usuario, mensajeChat);
					 * 
					 * for (int i = 0; i < listaChat.size(); i++) {
					 * 
					 * intProf.getAreaChat().setText(
					 * intProf.getAreaChat().getText() + "\n" +
					 * listaChat.get(i)); } intProf.getCampoChat().setText("");
					 * } else { intProf.getAreaChat().setText(
					 * "Error de comunicacion con Pizarra"); }
					 */
				}
			}
		});

		intProf.getBtnAgregar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getTextFieldNombre().getText().isEmpty()
						&& !intProf.getTextFieldValor().getText().isEmpty()
						&& !temaActual.equals("")) {

					String nombre = intProf.getTextFieldNombre().getText();
					String valor = intProf.getTextFieldValor().getText();
					String tema = temaActual;
					
					System.out.println(nombre+"-"+valor+"-"+tema);

					if (servicioProfesor.enviarVariableGlobal(nombre,
							valor,tema)) {

						intProf.getTextAreaPizarra()
								.setText(
										intProf.getTextAreaPizarra().getText()
												+ "Se ha definido una nueva variable global: "
												+ nombre + " = " + valor + "\n");
						anadirConstante(intProf.getTextFieldNombre().getText());
						intProf.getTextFieldNombre().setText("");
						intProf.getTextFieldValor().setText("");
					} else {
						intProf.getTextAreaPizarra().setText(
								"Error de comunicacion con Pizarra \n");
					}

				}
			}
		});

		intProf.getBtnBorrar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intProf.getTextFieldNombre().getText().isEmpty()
						&& !intProf.getTemaEvaluar().equals("")) {

					String nombre = intProf.getTextFieldNombre().getText();
					String tema = intProf.getTemaEvaluar();

					// Enviar por SCA
					if (servicioProfesor.borrarVariableGlobal(tema, nombre)) {
						eliminarConstante(intProf.getTextFieldNombre()
								.getText());
						intProf.getTextFieldNombre().setText("");
					} else {
						intProf.getTextAreaPizarra().setText(
								"Error de comunicacion con Pizarra \n");
						intProf.getTextFieldNombre().setText("");
					}
				}
			}
		});
	}

	public void anadirConstante(String nombre) {

		// Cambiar Entrada
		final JLabel botonNuevo = new JLabel(nombre);
		botonNuevo.setBorder(LineBorder.createBlackLineBorder());
		botonNuevo.setVisible(true);
		botonNuevo.setEnabled(true);

		if (intProf.getListaConstantesGlobales().size() == 0) {
			botonNuevo.setBounds(0, 0, 180, 20);
		} else {
			JLabel temp = intProf.getListaConstantesGlobales().get(
					intProf.getListaConstantesGlobales().size() - 1);

			botonNuevo.setBounds(0, (int) temp.getBounds().getCenterY() + 8,
					(int) temp.getBounds().getWidth(), (int) temp.getBounds()
							.getHeight());

		}

		intProf.getListaConstantesGlobales().add(botonNuevo);

		intProf.getPanelInternoConstantesGlobales().add(botonNuevo);

		intProf.getPanelInternoConstantesGlobales().setPreferredSize(
				new Dimension(0, (int) intProf
						.getPanelInternoConstantesGlobales().getSize()
						.getHeight() + 30));

		intProf.getPanelInternoConstantesGlobales().repaint();

		intProf.getScrollPanelConstantesGlobales().setViewportView(
				intProf.getPanelInternoConstantesGlobales());

		intProf.getScrollPanelConstantesGlobales().repaint();

	}

	public void eliminarConstante(String nombre) {

		System.out.println("Entra Antes");
		for (int i = 0; i < intProf.getListaConstantesGlobales().size(); i++) {

			JLabel temp = intProf.getListaConstantesGlobales().get(i);
			System.out.println(temp.getText());
			if (temp.getText().equals(nombre)) {
				intProf.getListaConstantesGlobales().remove(i);

				intProf.getPanelInternoConstantesGlobales().remove(temp);
				intProf.getPanelInternoConstantesGlobales().repaint();
				i = intProf.getListaConstantesGlobales().size();
				intProf.getPanelInternoConstantesGlobales().setPreferredSize(
						new Dimension(0, (int) intProf
								.getPanelInternoConstantesGlobales().getSize()
								.getHeight() - 30));
				intProf.getScrollPanelConstantesGlobales().setViewportView(
						intProf.getPanelInternoConstantesGlobales());
			}

		}

	}

	// Donde llamarlo?

	public void pintarSoluciones() {

		ArrayList<String> listaSoluciones = servicioProfesor
				.obtenerListaSoluciones(
						Integer.parseInt(preguntaActual.split("-")[0]),
						temaActual);

		for (int i = 0; i < listaSoluciones.size(); i++) {

			anadirSolucion(listaSoluciones.get(i));

		}

	}

	public void anadirSolucion(String nombre) {

		// Cambiar Entrada
		JLabel botonNuevo = new JLabel(nombre);
		botonNuevo.setBorder(LineBorder.createBlackLineBorder());
		botonNuevo.setVisible(true);
		botonNuevo.setEnabled(true);

		// Actualiza JComboBox
		intProf.getComboBoxSoluciones().addItem(nombre);
		intProf.getComboBoxSoluciones().repaint();

		if (intProf.getListaSolucionesEstudiantes().size() == 0) {
			botonNuevo.setBounds(0, 0, 180, 20);
		} else {
			JLabel temp = intProf.getListaSolucionesEstudiantes().get(
					intProf.getListaSolucionesEstudiantes().size() - 1);

			botonNuevo.setBounds(0, (int) temp.getBounds().getCenterY() + 8,
					(int) temp.getBounds().getWidth(), (int) temp.getBounds()
							.getHeight());

		}

		intProf.getListaSolucionesEstudiantes().add(botonNuevo);

		intProf.getPanelInternoSoluciones().add(botonNuevo);

		intProf.getPanelInternoSoluciones().setPreferredSize(
				new Dimension(0, (int) intProf.getPanelInternoSoluciones()
						.getSize().getHeight() + 30));

		intProf.getPanelInternoSoluciones().repaint();

		intProf.getScrollPaneSoluciones().setViewportView(
				intProf.getPanelInternoSoluciones());

		intProf.getScrollPaneSoluciones().repaint();

	}

	// Donde llamarlo?
	public void pintarEstudiantes() {

		ArrayList<String> listaEstudiantes = servicioProfesor
				.obtenerListaEstudiantes();

		for (int i = 0; i < listaEstudiantes.size(); i++) {

			// Actualiza JComboBox
			intProf.getComboBoxEstudiantes().addItem(listaEstudiantes.get(i));

		}

		intProf.getComboBoxEstudiantes().repaint();

	}

	public void anadirVariablesEstudiante(String estudiante) {

		intProf.getListaVariablesEstudiante().clear();
		intProf.setPanelInternoVariablesEstud(new JPanel());

		// Obtenido de SCA
		ArrayList<String> listaVariablesTemp = servicioProfesor
				.obtenerListaVariablesEstudiante(estudiante,
						Integer.parseInt(preguntaActual.split("-")[0]));

		for (int i = 0; i < listaVariablesTemp.size(); i++) {

			JLabel botonNuevo = new JLabel(listaVariablesTemp.get(i));
			botonNuevo.setBorder(LineBorder.createBlackLineBorder());
			botonNuevo.setVisible(true);
			botonNuevo.setEnabled(true);

			if (intProf.getListaVariablesEstudiante().size() == 0) {
				botonNuevo.setBounds(0, 0, 180, 20);
			} else {

				JLabel temp = intProf.getListaVariablesEstudiante().get(
						intProf.getListaVariablesEstudiante().size() - 1);

				botonNuevo.setBounds(0,
						(int) temp.getBounds().getCenterY() + 8, (int) temp
								.getBounds().getWidth(), (int) temp.getBounds()
								.getHeight());

			}

			intProf.getListaVariablesEstudiante().add(botonNuevo);

			intProf.getPanelInternoVariablesEstud().add(botonNuevo);

			intProf.getPanelInternoVariablesEstud().setPreferredSize(
					new Dimension(0, (int) intProf
							.getPanelInternoVariablesEstud().getSize()
							.getHeight() + 30));

		}

		intProf.getPanelInternoVariablesEstud().repaint();

		intProf.getScrollPaneVariablesEstud().setViewportView(
				intProf.getPanelInternoVariablesEstud());

		intProf.getScrollPaneVariablesEstud().repaint();

	}

	// Cambiar
	public void evaluarSolucion(String nombre) {

		for (int i = 0; i < intProf.getListaSolucionesEstudiantes().size(); i++) {

			JLabel temp = intProf.getListaSolucionesEstudiantes().get(i);
			System.out.println(temp.getText());

			// Falta Evaluacion por SCA

			if (temp.getText().equals(nombre)) {
				intProf.getListaSolucionesEstudiantes().remove(i);

				// Reestablece Combobox
				intProf.getComboBoxSoluciones().removeAllItems();
				intProf.getComboBoxSoluciones().addItem("");

				for (int i2 = 0; i2 < intProf.getListaSolucionesEstudiantes()
						.size(); i2++) {

					String text = intProf.getListaSolucionesEstudiantes()
							.get(i2).getText();
					System.out.println("Entra: " + text);
					intProf.getComboBoxSoluciones().addItem(text);

				}
				intProf.getComboBoxSoluciones().validate();
				intProf.getComboBoxSoluciones().repaint();

				intProf.getPanelInternoSoluciones().remove(temp);
				intProf.getPanelInternoSoluciones().repaint();
				i = intProf.getListaSolucionesEstudiantes().size();
				intProf.getPanelInternoSoluciones().setPreferredSize(
						new Dimension(0, (int) intProf
								.getPanelInternoSoluciones().getSize()
								.getHeight() - 30));
				intProf.getScrollPaneSoluciones().setViewportView(
						intProf.getPanelInternoSoluciones());
			}

		}

	}

	@Override
	public void actualizar() {

		System.out.println("Entra a Actualizar");
	}

}
